ROS学习(九)ROS Network(1)

前言

我们知道,在运行所有的ROS节点之前,一定要先使用指令roscore,实际上roscore指令是运行了一个ros master,ros master相当于一个服务器,所有节点都可以通过ros master发布消息和订阅消息,还包括发布和订阅服务,以及参数服务,只有连接在相同ros master下的节点才能互相通信。
怎样才能知道节点是运行在哪个master下的呢?实际上ROS中默认一个机器上只运行一个ros master,其运行的端口默认为http://localhost:11311, 这个端口默认值存于ROS环境变量ROS_MASTER_URI中,可以通过下面指令查看检验,或者在运行roscore的命令行输出中也可以看到

1
echo $ROS_MASTER_URI

还有其他一些ROS环境变量,可以了解一下
http://wiki.ros.org/ROS/EnvironmentVariables#ROS_PACKAGE_PATH
从上面的分析可以看出,即使是不同机器上的程序节点,只要通过网络连接到ros master的运行端口,就能实现消息的发布和订阅,并且发布的消息就能被所有连接到ros master端口的机器和节点所订阅,同样也可以订阅连接到这个端口的其他节点所发布的消息。有了这样的通讯方式,我们完全不用往我们的程序节点中添加任何与通讯相关的代码,就能订阅到其他机器发布的话题,与获取本机上其他节点发布的话题没有任何区别。

多机通信配置方法

下面来梳理一下实现ROS多机通讯的实现方法。

保证多机之间网络连接无误

在/etc/hosts中添加想要连接的那台机器的ip地址和主机名称,使用ping指令检查本机的网络连接和其他机器的网络连接。这里需要注意,如果不止两台机器连接,需要把所有需要和本机通讯的机器的ip和主机名添加到hosts文件里。

修改ROS环境变量

与网络通讯相关的ROS环境变量主要有3个,分别是

1
2
3
ROS_MASTER_URI
ROS_IP
ROS_HOSTNAME

前面已经提到,这种通讯方式只能运行一个ros master,因此,选定一台机器作为master,将所有机器的ROS_MASTER_URI设置为改机器的ROS_MASTER_URI值,举个例子,我的主机名为wlh,则我的ROS_MASTER_URI应该设置为http://wlh:11311, 则所有连接到我这个ros master的机器上的ROS_MASTER_URI都应该设置为http://wlh:11311, 设置环境变量值用export指令,ROS_IP和ROS_HOSTNAME则分别是本机的IP地址和主机名。

简单测试

为了测试通讯是否成功,只要用rostopic pub指令在一台机器上发布一条消息,如果通讯成功,其他所有和该机器连接的机器上,就能使用rostopic echo接收到消息了。

参考链接
http://wiki.ros.org/ROS/Tutorials/MultipleMachines
http://wiki.ros.org/ROS/NetworkSetup